/***********************
所有类的声明
***********************/

#pragma once
#include <iostream>
#include <fstream>

#define FILENAME "empfile.txt"
using namespace std;


/****************************************************************************************************
管理类的声明，主要负责的内容是：
与用户的交互界面
对职工增删改查的操作
与文件的读写交互
***************************************************************************************************/
//前置部分类的声明
class Worker;

class WorkerManager
{
public:
    WorkerManager();
    void show_menu();//展示菜单
    void exit_system();//退出当前系统
    void add_emp();//添加职工信息
    void save();//保存所添加的职工信息到磁盘
    int get_empnum();//获取文件中已经保存的职工数量
    void init_emp();//初始化员工信息
    void show_emp();//显示职工信息
    void delete_emp();//删除职工信息
    int is_emp_exit(int id);//根据职工信息判断某个员工是否存在，并返回职工在数组中的位置，不存在返回-1
    void modify_emp();//修改某个职工信息
    void find_emp();//查找某个职工的信息
    void sort_emp();//按照编号排序
    void clean_emp();//清空文件
    ~WorkerManager();
    int m_empnum;
    Worker** m_emp_array;
    bool m_file_is_empty = false;//判断文件是否为空的标志
    
};

/**********************************************************************************************************************
创建职工抽象类，将三种职工抽象到一个类(worker)中，利用多态管理不同职工种类
职工的属性为：编号、姓名、所在部门编号
职工的行为：岗位职责信息的描述，获取岗位名称
*********************************************************************************************************************/
class Worker
{
public:
    virtual void show_info() = 0;//显示个人信息
    virtual string get_depart_name() = 0;//获取岗位名称
    int m_id;//职工编号
    string m_name;//职工姓名
    int m_departid;//部门编号
};

//创建普通员工类
class Employee : public Worker
{
public:
    Employee(int id, string name, int depart_id);//构造函数
    virtual void show_info();//显示个人信息
    virtual string get_depart_name();//获取岗位信息
};

//创建经理类
class Manager : public Worker
{
public:
    Manager(int id, string name, int depart_id);//构造函数
    virtual void show_info();//显示个人信息
    virtual string get_depart_name();//获取岗位信息
};

//创建老板类
class Boss : public Worker
{
public:
    Boss(int id, string name, int depart_id);//构造函数
    virtual void show_info();//显示个人信息
    virtual string get_depart_name();//获取岗位信息
};